package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.DeptService;
import com.itheima.service.EmpExprService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Wrapper;
import java.time.LocalDateTime;
import java.util.List;


//继承
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

     @Autowired
     private DeptService deptService;
      @Autowired
       private EmpExprService empExprService;
      // 查询员工分页数据
    @Override
    public PageResult pageds(EmpQueryParam param) {
        //定义分页参数
        IPage<Emp> ipage=new Page<>(param.getPage(), param.getPageSize());
        // 1.调用Service层查询分页数据
       /* IPage<Emp> result = page(ipage);*///这个只是分页查询


        //定义我们的条件构建器
        LambdaQueryWrapper<Emp>Wrapper= Wrappers.lambdaQuery();
            //设置查询条件
        //姓名
        //判断 输入的姓名是否为空,这种判断方法呢是专门提供的，可以更便捷的判断是否等于空
        Wrapper.like(param .getName()!=null, Emp::getName, param.getName());
        //性别
        Wrapper.eq(param.getGender() !=null, Emp::getGender, param.getGender());
        //入职时间
       Wrapper.between(param .getBegin() !=null && param.getEnd() !=null, Emp::getEntryDate, param.getBegin(), param.getEnd());
        /*待条件的分页查询*/
        IPage<Emp> result = page(ipage, Wrapper);




        //------------多表操作开始
        //2.获取员工的集合列表但是不包括部门id
        List<Emp> records = result.getRecords();

        //获取员工列表中所对应的部门id
        List<Integer> deptIds = records.stream().map(emp -> emp.getDeptId()).toList();
        //有可能部门id会重复先去重一下
        deptIds = deptIds.stream().distinct().toList();
        //根据部门的id获取部门的名称
        List<Dept> depts = deptService.listByIds(deptIds);

        records.forEach(emp -> {
            depts.stream().filter( dept -> dept.getId().equals(emp.getDeptId()))
                    .findFirst()
                    .ifPresent(dept -> emp.setDeptName(dept.getName()));
        });
        //------------多表操作结束
        PageResult pageResult = new PageResult(result.getTotal(),records);

        return pageResult;
    }
/*新增员工*/
    @Override
    public void saveEmp(Emp emp) {

        // 新增员工
        emp.setCreateTime( LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
         emp.setPassword("123456");
         // 保存员工
         save(emp);

         //处理工作经历
        // 获取工作经历列表
        List<EmpExpr> exprList = emp.getExprList();
        // 设置员工id
        exprList.stream().forEach( expr -> expr.setEmpId(emp.getId()));
        // 批量保存
        empExprService.saveBatch(exprList);


    }
     /*单一查询根据id*/
    @Override
    public Emp getmpByid(Integer id) {
        // 1.根据员工id查询员工信息
         Emp emp = getById(id);
        //2.根据员工id查询工作经历集合
        List<EmpExpr> empExprs = empExprService.list(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, id));
        //3.把工作经历集合封装到Emp对象中的exprList属性中
        emp.setExprList(empExprs);
        return emp;

    }
    /*修改员工信息*/
    @Override
    public void updateEmp(Emp emp) {
         emp.setUpdateTime(LocalDateTime.now());
          updateById(emp);
        // 根据id批量删除员工的工作经历信息
        empExprService.remove(new LambdaQueryWrapper<EmpExpr>().eq(EmpExpr::getEmpId, emp.getId()));


        // 根据id批量删除员工的工作经历信息
        //先 获取员工id
        List<EmpExpr> exprList = emp.getExprList();
        //判断员工是否有工作经历
        if (exprList != null && !exprList.isEmpty()) {
            exprList.forEach(expr -> expr.setEmpId(emp.getId()));
        }
         empExprService.saveBatch(exprList);

    }
   /*批量删除员工信息*/
    @Override
    public Result removeEmpByIds(List<Integer> ids) {
        //1.直接 删除员工信息
        removeBatchByIds(ids);
        //3.根据empId集合去查询emp_expr表数据是否有数据
        boolean flag = empExprService.count(Wrappers.<EmpExpr>lambdaQuery().in(EmpExpr::getEmpId, ids))>0;
        if(flag==false){
            return Result.success("删除成功");
        }
        //2.删除员工的工作经历信息
        boolean remove = empExprService.remove(Wrappers.<EmpExpr>lambdaQuery().in(EmpExpr::getEmpId, ids));
        return remove?Result.success("删除成功"):Result.error("删除失败");
    }
}
